home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / gnu / cperf-21.lha / cperf-2.1 / src / iterator.c < prev    next >
C/C++ Source or Header  |  1989-11-11  |  3KB  |  107 lines

  1. /* Provides an Iterator for keyword characters.
  2.    Copyright (C) 1989 Free Software Foundation, Inc.
  3.    written by Douglas C. Schmidt (schmidt@ics.uci.edu)
  4.  
  5. This file is part of GNU GPERF.
  6.  
  7. GNU GPERF is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 1, or (at your option)
  10. any later version.
  11.  
  12. GNU GPERF is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with GNU GPERF; see the file COPYING.  If not, write to
  19. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  20.  
  21. #include <stdio.h>
  22. #include <ctype.h>
  23. #include "iterator.h"
  24.  
  25. /* Locally visible ITERATOR object. */
  26.  
  27. ITERATOR iterator;
  28.  
  29. /* Constructor for ITERATOR. */
  30.  
  31. void
  32. iterator_init (s, lo, hi, word_end, bad_val, key_end)
  33.      char *s;
  34.      int lo;
  35.      int hi;
  36.      int word_end;
  37.      int bad_val;
  38.      int key_end;
  39. {
  40.   iterator.end         = key_end;
  41.   iterator.error_value = bad_val;
  42.   iterator.end_word    = word_end;
  43.   iterator.str         = s;
  44.   iterator.hi_bound    = hi;
  45.   iterator.lo_bound    = lo;
  46. }
  47.  
  48. /* Define several useful macros to clarify subsequent code. */
  49. #define ISPOSDIGIT(X) ((X)<='9'&&(X)>'0')
  50. #define TODIGIT(X) ((X)-'0')
  51.  
  52. /* Provide an Iterator, returning the ``next'' value from 
  53.    the list of valid values given in the constructor. */
  54.  
  55. int 
  56. next ()
  57. /* Variables to record the Iterator's status when handling ranges, e.g., 3-12. */
  58.  
  59.   static int size;              
  60.   static int curr_value;           
  61.   static int upper_bound;
  62.  
  63.   if (size) 
  64.     { 
  65.       if (++curr_value >= upper_bound) 
  66.         size = 0;    
  67.       return curr_value; 
  68.     }
  69.   else 
  70.     {
  71.       while (*iterator.str) 
  72.         {
  73.           if (*iterator.str == ',') 
  74.             iterator.str++;
  75.           else if (*iterator.str == '$') 
  76.             {
  77.               iterator.str++;
  78.               return iterator.end_word;
  79.             }
  80.           else if (ISPOSDIGIT (*iterator.str))
  81.             {
  82.  
  83.               for (curr_value = 0; isdigit (*iterator.str); iterator.str++) 
  84.                 curr_value = curr_value * 10 + *iterator.str - '0';
  85.  
  86.               if (*iterator.str == '-') 
  87.                 {
  88.  
  89.                   for (size = 1, upper_bound = 0; 
  90.                        isdigit (*++iterator.str); 
  91.                        upper_bound = upper_bound * 10 + *iterator.str - '0');
  92.  
  93.                   if (upper_bound <= curr_value || upper_bound > iterator.hi_bound) 
  94.                     return iterator.error_value;
  95.                 }
  96.               return curr_value >= iterator.lo_bound && curr_value <= iterator.hi_bound 
  97.                 ? curr_value : iterator.error_value;
  98.             }
  99.           else
  100.             return iterator.error_value;               
  101.         }
  102.  
  103.       return iterator.end;
  104.     }
  105. }
  106.